release: merge current main-target PR set#318
Merged
Conversation
This was referenced Mar 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Merge the current
main-target PR set through a single verified release branch.Included PRs: #140 #141 #149 #263 #298 #299 #300 #302 #303 #304 #306 #307 #308 #309
Additional release fixes
forecastcommand testssessionAffinityMaxEntriesEACCESas retryable for queued settings writesLocal validation
npm run clean:repo:checknpm run typechecknpm run buildnpm run lintnpm test -- test/storage.test.ts test/named-backup-export.test.ts test/storage-recovery-paths.test.ts test/backup-metadata-builder.test.tsnpx vitest run --maxWorkers=1 --silent --shard=1/4npx vitest run --maxWorkers=1 --silent --shard=2/4npx vitest run --maxWorkers=1 --silent --shard=1/8npx vitest run --maxWorkers=1 --silent --shard=2/8npx vitest run --maxWorkers=1 --silent --shard=3/8npx vitest run --maxWorkers=1 --silent --shard=4/8npx vitest run --maxWorkers=1 --silent --shard=5/8Known local blocker
main.note: greptile review for oc-chatgpt-multi-auth. cite files like
lib/foo.ts:123. confirm regression tests + windows concurrency/token redaction coverage.Greptile Summary
large release branch merging 14 prs. core areas touched: session-affinity gets
lastResponseIdthreading for response continuation;named-backup-exportfixes a real concurrency race (in-flight guard now set before firstawait);backup-metadata-builderintroduces correct priority-ordered snapshot selection;import-exportfixes the previously flagged negativeimportedCountbug;settings-write-queueaddsEACCESto retryable codes (helpful on windows, mild false-positive on linux); thecodex-managersurface is heavily refactored into focused sub-modules.proactiveRefreshGuardian/proactiveRefreshIntervalMsunreachable in UI) is resolved — both are now in therefresh-recoverycategoryimportedCountgoing negative) is resolved —mergeImportedAccountsnow deduplicates existing accounts before computing the deltarememberLastResponseIdis a zero-value wrapper aroundupdateLastResponseId; the jsdoc references a non-existentrememberWithResponseIdupsert method — clean up or implement the referenced methodsessionAffinityMaxEntrieszod schema lacks.max(4_096)to match the ui cap, so direct config edits can grow the in-memory map unboundedlyEACCESinRETRYABLE_SETTINGS_WRITE_CODESis correct for windows file locks but adds ~800ms of wasted retry time on linux/macOS for true permission-denied errorsConfidence Score: 4/5
.max()onsessionAffinityMaxEntriesand the danglingrememberWithResponseIdjsdoc referenceImportant Files Changed
lastResponseIdto affinity entries withgetLastResponseId,updateLastResponseId, and a redundantrememberLastResponseIdwrapper; eviction logic correctly extracted tosetEntry; dangling jsdoc reference to non-existentrememberWithResponseIdEACCESadded as retryable which is correct for windows file locks but will cause silent 800ms delay on linux/macOS permanent permission errorsinFlightNamedBackupExports.add(exportKey)moved before the firstawait, closing the race window where two concurrent exports to the same path could both pass the in-flight guard;forceno longer bypasses the concurrent-export lock (correct)importedCountnow comparesdeduplicatedAccountsvsdeduplicatedExistingAccounts(not rawexistingAccounts), preventing negative counts when existing storage has internal duplicates; atomic write via temp-file + rename with windows retryresponseContinuationandbackgroundResponsesboolean fields;sessionAffinityMaxEntriesUI cap (4_096) is set in backend-settings-schema but the Zod schema here still has no.max(), allowing arbitrarily large values from direct config editsproactiveRefreshGuardian(toggle) andproactiveRefreshIntervalMs(number) are now present in therefresh-recoverycategory, resolving the prior review concern about those controls being unreachable in the UISequence Diagram
sequenceDiagram participant Caller participant SessionAffinityStore participant EntriesMap Note over Caller,EntriesMap: response continuation flow (new) Caller->>SessionAffinityStore: remember(sessionKey, accountIndex, now) SessionAffinityStore->>EntriesMap: get(key) → existingEntry (preserve lastResponseId) SessionAffinityStore->>SessionAffinityStore: setEntry(key, {accountIndex, lastResponseId: existing}) SessionAffinityStore->>EntriesMap: evict oldest if at maxEntries, then set Caller->>SessionAffinityStore: updateLastResponseId(sessionKey, responseId, now) SessionAffinityStore->>EntriesMap: get(key) → entry alt entry missing or expired SessionAffinityStore-->>Caller: no-op (delete if expired) else entry live SessionAffinityStore->>SessionAffinityStore: setEntry(key, {...entry, lastResponseId, expiresAt refreshed}) SessionAffinityStore-->>Caller: void end Caller->>SessionAffinityStore: getLastResponseId(sessionKey, now) SessionAffinityStore->>EntriesMap: get(key) alt expired SessionAffinityStore->>EntriesMap: delete(key) SessionAffinityStore-->>Caller: null else live SessionAffinityStore-->>Caller: lastResponseId (trimmed) or null endPrompt To Fix All With AI
Reviews (3): Last reviewed commit: "Fix release branch review follow-ups" | Re-trigger Greptile